package org.convallaria.system.biz.service.auth;

import org.convallaria.system.biz.entity.dto.LoginDTO;
import org.convallaria.system.biz.entity.dto.TokenDTO;

import java.util.Map;

/**
 * 认证服务接口
 * 
 * 功能特性：
 * - 用户登录认证
 * - Token管理
 * - 用户信息获取
 * - 登录日志记录
 * - 多租户支持
 * - 安全验证
 * 
 * @author convallaria
 * @since 1.0.0
 */
public interface AuthService {

    /**
     * 用户登录
     * 
     * @param loginDTO 登录信息
     * @return Token信息
     */
    TokenDTO login(LoginDTO loginDTO);

    /**
     * 用户登出
     * 
     * @param token JWT token
     */
    void logout(String token);

    /**
     * 刷新Token
     * 
     * @param refreshToken 刷新token
     * @return 新的Token信息
     */
    TokenDTO refreshToken(String refreshToken);

    /**
     * 获取当前用户信息
     * 
     * @return 用户信息
     */
    Object getCurrentUserInfo();

    /**
     * 获取当前用户详细信息（包含角色、权限、部门、岗位）
     * 
     * @return 用户详细信息
     */
    Map<String, Object> getCurrentUserDetailInfo();

    /**
     * 获取当前用户菜单树
     * 
     * @return 用户菜单树
     */
    Object getCurrentUserMenus();

    /**
     * 获取当前用户权限列表
     * 
     * @return 权限列表
     */
    Object getCurrentUserPermissions();

    /**
     * 验证Token是否有效
     * 
     * @param token JWT token
     * @return 是否有效
     */
    boolean validateToken(String token);

    /**
     * 从Token中获取用户信息
     * 
     * @param token JWT token
     * @return 用户信息
     */
    Object getUserInfoFromToken(String token);


    /**
     * 检查用户是否在线
     * 
     * @param userId 用户ID
     * @return 是否在线
     */
    boolean isUserOnline(Long userId);

    /**
     * 强制用户下线
     * 
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean forceLogout(Long userId);

    /**
     * 获取在线用户列表
     * 
     * @return 在线用户列表
     */
    Object getOnlineUsers();

    /**
     * 修改密码
     * 
     * @param oldPassword 旧密码
     * @param newPassword 新密码
     * @return 是否成功
     */
    boolean changePassword(String oldPassword, String newPassword);

    /**
     * 重置密码
     * 
     * @param userId 用户ID
     * @param newPassword 新密码
     * @return 是否成功
     */
    boolean resetPassword(Long userId, String newPassword);

    /**
     * 检查用户权限
     * 
     * @param permission 权限标识
     * @return 是否有权限
     */
    boolean hasPermission(String permission);

    /**
     * 检查用户角色
     * 
     * @param role 角色标识
     * @return 是否有角色
     */
    boolean hasRole(String role);

    /**
     * 获取用户登录历史
     * 
     * @param userId 用户ID
     * @param pageNum 页码
     * @param pageSize 页大小
     * @return 登录历史
     */
    Object getUserLoginHistory(Long userId, Integer pageNum, Integer pageSize);
}
